package com.dms.modules.order.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dms.modules.order.dto.OrderItemDTO;
import com.dms.modules.order.dto.RefundAuditDTO;
import com.dms.modules.order.dto.OrderSubmitDTO;
import com.dms.modules.order.entity.Order;
import com.dms.modules.order.vo.OrderDetailVO;
import com.dms.modules.order.vo.OrderVO;
import java.util.List;

/**
 * 订单服务接口
 */
public interface OrderService extends IService<Order> {
    
    /**
     * 检查商品库存
     * @param orderItemDTO 订单项信息
     * @return 是否库存充足
     */
    boolean checkStock(OrderItemDTO orderItemDTO);
    
    /**
     * 取消订单
     * @param userId 用户ID
     * @param orderId 订单ID
     * @param cancelReason 取消原因
     * @return 是否成功
     */
    boolean cancelOrder(Long userId, Long orderId, String cancelReason);
    
    /**
     * 支付订单
     * @param userId 用户ID
     * @param orderId 订单ID
     * @param paymentMethod 支付方式
     * @param paymentNo 支付流水号
     * @return 是否成功
     */
    boolean payOrder(Long userId, Long orderId, String paymentMethod, String paymentNo);
    
    /**
     * 确认收货
     * @param userId 用户ID
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean confirmReceipt(Long userId, Long orderId);
    
    /**
     * 获取订单详情
     * @param userId 用户ID
     * @param orderId 订单ID
     * @return 订单详情
     */
    OrderDetailVO getOrderDetail(Long userId, Long orderId);
    
    /**
     * 分页获取用户订单列表
     * @param page 分页参数
     * @param userId 用户ID
     * @param status 订单状态
     * @return 分页订单列表
     */
    IPage<OrderVO> getUserOrders(Page<Order> page, Long userId, Integer status);
    
    /**
     * 申请退款
     * @param userId 用户ID
     * @param orderId 订单ID
     * @param reason 退款原因
     * @return 退款申请ID
     */
    Long applyRefund(Long userId, Long orderId, String reason);
    
    /**
     * 获取待付款订单数量
     * @param userId 用户ID
     * @return 待付款订单数量
     */
    Integer getUnpaidCount(Long userId);
    
    /**
     * 获取待发货订单数量
     * @param userId 用户ID
     * @return 待发货订单数量
     */
    Integer getUnshippedCount(Long userId);
    
    /**
     * 获取待收货订单数量
     * @param userId 用户ID
     * @return 待收货订单数量
     */
    Integer getUnreceivedCount(Long userId);
    
    /**
     * 删除订单（逻辑删除）
     * @param userId 用户ID
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean deleteOrder(Long userId, Long orderId);
    
    /**
     * 获取用户订单历史
     * @param userId 用户ID
     * @param limit 获取数量限制
     * @return 订单列表
     */
    List<Order> getUserRecentOrders(Long userId, int limit);
    
    /**
     * 计算商家月销量
     */
    int calculateMerchantMonthlySales(Long merchantId);
    
    /**
     * 计算商家总销量
     */
    int calculateMerchantTotalSales(Long merchantId);
    
    /**
     * 分页获取商家订单列表
     * @param page 分页参数
     * @param merchantId 商家ID
     * @param status 订单状态
     * @return 分页订单列表
     */
    IPage<OrderVO> getMerchantOrders(Page<Order> page, Long merchantId, Integer status);
    
    /**
     * 商家发货
     * @param orderId 订单ID
     * @param deliveryCompany 快递公司
     * @param deliveryNo 快递单号
     * @return 是否成功
     */
    boolean shipOrder(Long orderId, String deliveryCompany, String deliveryNo);
    
    /**
     * 审核退款申请
     * @param merchantId 商家ID
     * @param refundAuditDTO 退款审核信息
     * @return 审核结果
     */
    boolean auditRefund(Long merchantId, RefundAuditDTO refundAuditDTO);
    
    /**
     * 统一下单接口
     * @param userId 用户ID
     * @param submitDTO 下单信息
     * @return 订单ID列表（多商家拆单）
     */
    List<Long> submitOrder(Long userId, OrderSubmitDTO submitDTO);
    
    /**
     * 商家端获取订单详情
     * @param merchantId 商家ID
     * @param orderId 订单ID
     * @return 订单详情
     */
    OrderDetailVO getMerchantOrderDetail(Long merchantId, Long orderId);

    /**
     * 更新订单状态
     * @param orderId 订单ID
     * @param status 订单状态
     * @return 是否成功
     */
    boolean updateOrderStatus(Long orderId, Integer status);

    /**
     * 获取订单VO分页数据（管理员）
     *
     * @param page 分页参数
     * @param wrapper 查询条件
     * @return 订单VO分页数据
     */
    IPage<OrderVO> getOrderVOPage(Page<Order> page, LambdaQueryWrapper<Order> wrapper);

    /**
     * 获取订单详情（管理员）
     *
     * @param id 订单ID
     * @return 订单详情VO
     */
    OrderDetailVO getAdminOrderDetail(Long id);

    /**
     * 强制退款（管理员）
     *
     * @param id 订单ID
     * @param reason 退款原因
     * @return 操作结果
     */
    boolean forceRefund(Long id, String reason);

    /**
     * 强制取消订单（管理员）
     *
     * @param id 订单ID
     * @param reason 取消原因
     * @return 操作结果
     */
    boolean forceCancel(Long id, String reason);

    /**
     * 检查商品是否在订单中
     * @param orderId 订单ID
     * @param productId 商品ID
     * @return 商品是否在订单中
     */
    boolean isProductInOrder(Long orderId, Long productId);
} 